package com.yike.user.utils;

import com.yike.user.vo.AgentAreaInfoVo;
import com.yike.user.vo.AreaInfoVo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Sakura
 * @date 2024/9/13 17:56
 */
public class AreaTreeBuilder {

    /**
     * 将 AreaInfoVo 集合转换为树形结构的 AgentAreaInfoVo 集合
     */
    public List<AgentAreaInfoVo> buildAreaTree(Set<AreaInfoVo> areaInfoVos) {
        // 1. 将 AreaInfoVo 按 parent_id 分组
        Map<Long, List<AreaInfoVo>> groupedByParentId = areaInfoVos.stream()
                .collect(Collectors.groupingBy(AreaInfoVo::getParentId));

        // 2. 从根节点（parent_id 为 null 或 0）开始构建树
        return buildTree(groupedByParentId, 0L);
    }

    /**
     * 递归方法构建树
     */
    private List<AgentAreaInfoVo> buildTree(Map<Long, List<AreaInfoVo>> groupedByParentId, Long parentId) {
        List<AgentAreaInfoVo> result = new ArrayList<>();
        // 获取当前层级的所有节点
        List<AreaInfoVo> currentLevelAreas = groupedByParentId.get(parentId);

        if (currentLevelAreas != null) {
            for (AreaInfoVo areaInfo : currentLevelAreas) {
                // 创建 AgentAreaInfoVo 对象
                AgentAreaInfoVo agentArea = new AgentAreaInfoVo();
                agentArea.setName(areaInfo.getName());
                agentArea.setCode(areaInfo.getCode());

                // 递归构建子节点
                List<AgentAreaInfoVo> children = buildTree(groupedByParentId, areaInfo.getId());
                agentArea.setChildren(children);

                result.add(agentArea);
            }
        }

        return result;
    }
}
